<?php
/**
 * Created by PhpStorm.
 * User: Guojunchen
 * Date: 2018/7/4
 * Time: 16:55
 */

namespace app\index\controller;


use think\Controller;
use think\Db;
use app\admin\model\shop\Order as shopOrder;

class Timer extends Controller{


    /*******************************************************************************天定时************************************************/

//    /**
//     * 一天进行的改变
//     * 该用户任务订单数量
//     */
//    public function UserOrder(){
//        $arr = Db::name("user_attribute")->where("attr_id","not null")->field("uid,task_count,task_day_count,month_task_count")->select();//获取所有的派克属性
//
//    }

    //派克只可以取消一次一天
    public function cancleCount(){
        $value = Db::name("system")->where("key","sys_cancel_count")->value("value");
        //echo $value;exit;
        Db::name("user")->where("uid","not null")->update(["cancel_count"=>$value]);
    }

    //派克订单状态为0的定时超过限制的订单数改为取消
    public function cancleOrder(){
        $shop_order = new shopOrder();
        $order_paike_pic_limit_time = intval(Db::name("system")->where("key","order_paike_pic_limit_time")->value("value"));//系统参数
        $time =time() - $order_paike_pic_limit_time*60;//秒
        $order_id_arr = Db::name("shop_order")
            ->where("is_cancel",1)
            ->where("status",0)
            ->where("update_time","lt",$time)
            ->field("order_id,uid")
            ->select();
        //halt($order_id_arr);
//        foreach ($order_id_arr as $value){
//            $shop_order->order_cancle_func($value,2);
//        }

        $data  = [];
        $order_arr = Db::name("queue")->where("status",0)->where("send_type","cancle")->column("message_send_id");
        foreach ($order_id_arr as $key => $val) {
            if(!in_array($val['order_id'],$order_arr)) {
                $data[$key]['user_id']         = $val['uid'];//用户id
                $data[$key]['status']          = 0;
                $data[$key]['title']           = "取消的订单";
                $data[$key]['create_time']     = time();
                $data[$key]['send_type']       = "cancle";
                $data[$key]['message_send_id'] = $val['order_id'];//订单id
            }
        }

        Db::name("queue")->insertAll($data);

    }


    //派克订单状态为0的定时超过限制的订单数改为取消(定时)
    public function cancelOrderAct(){
        $queue = Db::name("queue")->where('status', 0)->where('send_type','cancle')->order('create_time ASC')->select();
        try {
            if(!empty($queue)){
                foreach ($queue as $key => $value) {
                    //站内信
                    // 1.当前任务将由哪个类来负责处理。
                    //   当轮到该任务时，系统将生成一个该类的实例，并调用其 fire 方法
                    $jobHandlerClassName = 'app\common\queue\CancelOrderQueueClient@instationMsg';
                    // 2.当前任务归属的队列名称，如果为新队列，会自动创建
                    $jobQueueName = "sd_order_cancle";
                    // 3.当前任务所需的业务数据 . 不能为 resource 类型，其他类型最终将转化为json形式的字符串
                    // (msgData 为对象时，需要在先在此处手动序列化，否则只存储其public属性的键值对)
                    $msgData = [
                        'id'              => $value['id'],
                        'title'           => $value['title'],
                        'uid'             => $value['user_id'],
                        'message_type'    => $value["send_type"],
                        'url'             =>  '',
                        'message_send_id' => $value['message_send_id'],
                    ];
                    // echo '开始推送消息:'.'</br>';
                    \think\Queue::push($jobHandlerClassName, $msgData, $jobQueueName);
                }
            }
        } catch (Exception $e) {
            echo $e->getMessage();
        }

    }



    //每分5钟跑一次接口
    public   function gereOrder()
    {
        $shopOrder = new shopOrder();
        //$shopName = $shopOrder->getStatusName();
        $time_1 = intval(Db::name("system")->where("key","wei_xin_msg")->value("value"));
        $join[] = ["sd_wx_users s", "a.uid = s.uid", "left"];//
        $time = time() - $time_1*60*60;
        $order_list = Db::name("shop_order")
            ->alias("a")
            ->join($join)
            ->where("a.status", 2)
            ->where("a.task_type", 2)
            ->where("a.is_cancel", 1)
            ->where("a.update_time","lt",$time)
            ->where("a.order_state", "neq", '1')
            ->field("a.*,s.openid")
            ->select();

        $data  = [];

        $order_arr = Db::name("queue")->where("status",0)->where("send_type","gere")->column("message_send_id");
        foreach ($order_list as $key => $val) {
            if(!in_array($val['order_id'],$order_arr)) {
                $data[$key]['user_id'] = $val['uid'];//用户id
                $data[$key]['status'] = 0;
                $data[$key]['title'] = "隔日的订单";
                $data[$key]['create_time'] = time();
                $data[$key]['send_type'] = "gere";
                $data[$key]['message_send_id'] = $val['order_id'];//订单id
            }
        }

        Db::name("queue")->insertAll($data);
//        foreach ($order_list as $k => $v) {
//            $update_time_v = date("Y-m-d H:i:s",$v["update_time"]);
//            $task_type_v = "";
//            if($v["task_type"]==1){
//                $task_type_v = "精刷单";
//            }elseif($v["task_type"]==2){
//                $task_type_v = "隔日单";
//            }elseif($v["task_type"]==3){
//                $task_type_v = "流量单";
//            }
//            $status_name_v = $shopName[$v["status"]];
//            $shop_name_v = $v["shop_name"];
//            $shop_desc_v = "订单编号".$v["order_sno"]."商品名称：".$v["goods_sno"];
//            $msg = [
//                "condition" => 27,
//                "touser" => $v["openid"],
//                "content" => [$update_time_v,$task_type_v,$status_name_v,$shop_name_v,$shop_desc_v]
//            ];
//            $MiniMsg = new  \app\common\lib\MiniMsg($msg);
//            $MiniMsg->sendMsg();//发送短信模板银行卡修改成功
//
//        }

    }


    //每分5钟跑一次接口的消息队列(执行)
    public  function gereOrderTask(){

        $queue = Db::name("queue")->where('status', 0)->where('send_type','gere')->order('create_time ASC')->select();
        try {
            if(!empty($queue)){
                foreach ($queue as $key => $value) {
                    //站内信
                    // 1.当前任务将由哪个类来负责处理。
                    //   当轮到该任务时，系统将生成一个该类的实例，并调用其 fire 方法
                    $jobHandlerClassName = 'app\common\queue\GereOrderQueueClient@instationMsg';
                    // 2.当前任务归属的队列名称，如果为新队列，会自动创建
                    $jobQueueName = "sd_order_gere";
                    // 3.当前任务所需的业务数据 . 不能为 resource 类型，其他类型最终将转化为json形式的字符串
                    // (msgData 为对象时，需要在先在此处手动序列化，否则只存储其public属性的键值对)
                    $msgData = [
                        'id'              => $value['id'],
                        'title'           => $value['title'],
                        'uid'             => $value['user_id'],
                        'message_type'    => $value["send_type"],
                        'url'             =>  '',
                        'message_send_id' => $value['message_send_id'],
                    ];
                    // echo '开始推送消息:'.'</br>';
                    \think\Queue::push($jobHandlerClassName, $msgData, $jobQueueName);
                }
            }
        } catch (Exception $e) {
            echo $e->getMessage();
        }

    }



    //(每5分钟跑一次)达到7天，未点击发货现在是：可评价，自动变为可评价(状态是7)
    public  function getIsPraise(){
        //$shop_order = new shopOrder();
        $order_paike_priase_limit_time = intval(Db::name("system")->where("key","sys_cancle_praise_fahuo")->value("value"));//系统参数
        $time = time() - $order_paike_priase_limit_time*24*60*60;
        $_where["r.status"]=7;
        $_where["r.order_state"] = array("neq",'1');
        $_where["r.is_cancel"] = 1;
        $_where["r.update_time"] = array("lt",$time);
        $join[] = ["sd_shop_task k","k.task_id = r.task_id","left"];
        $order_list = Db::name("shop_order")->alias("r")->join($join)->where($_where)->field("r.*,k.is_need_send,k.is_good_evalute,k.is_review")->select();
        $data                    = [];
        $order_arr = Db::name("queue")->where("status",0)->where("send_type","praise")->column("message_send_id");
        foreach ($order_list as $key => $val) {
            if(!in_array($val['order_id'],$order_arr)) {
                $data[$key]['user_id'] = $val['uid'];//用户id
                $data[$key]['status'] = 0;
                $data[$key]['title'] = "未评价的订单";
                $data[$key]['create_time'] = time();
                $data[$key]['send_type'] = "praise";
                $data[$key]['message_send_id'] = $val['order_id'];//订单id
            }
        }
        Db::name("queue")->insertAll($data);
//        foreach ($order_list as $key=>$value){
//
//            if($value["is_need_send"] == 1 && $value["is_good_evalute"] == 2 && $value["is_review"] == 2){
//
//                Db::name("shop_order")->where(["order_id"=>$value["order_id"]])->update(["status" => 13,"update_time"=>time(),"author"=>0,"author_status"=>1,"finished_time"=>time()]);//隔日单和精刷单--已完成
//
//                //改变用户的完成订单数
//                Db::name("user_attribute")->where("uid",$value["uid"])->setInc("task_finish_count",1);
//
//                $openid = Db::name("wx_users")->where("uid",$value["uid"])->value("openid");
//
//                $content = [
//                    $value["shop_name"], $value["goods_sno"], $value["real_money"], $openid
//                ];//推荐内容
//                $msg = [
//                    "condition" => 14,
//                    "touser" => $openid,
//                    "content" => $content
//                ];
//                $MiniMsg = new  \app\common\lib\MiniMsg($msg);
//                $MiniMsg->sendMsg();//发送短信模板订单已完成
//                //计算钱
//                $gold = new \app\common\controller\GoldBean();
//                $gold->finishedBean($value);
//
//
//            }else{
//
//                Db::name("shop_order")->where('order_id',$value["order_id"])->update(['status' => 9,"update_time"=>time()]);
//
//                $openid = Db::name("wx_users")->where("uid",$value["uid"])->value("openid");
//
//                $content = [
//                    $value["order_sno"], date("Y-m-d H:i:s",$value["create_time"]), $value["real_money"], 1,"已发货"
//                ];//推荐内容
//                $msg = [
//                    "condition" => 19,
//                    "touser" => $openid,
//                    "content" => $content
//                ];
//                $MiniMsg = new  \app\common\lib\MiniMsg($msg);
//                $MiniMsg->sendMsg();//发送短信模板订单已完成
//
//            }
//
//
//        }

    }


    //每5分钟跑一次)达到7天，未点击发货现在是：可评价，自动变为可评价(状态是7)跑的消息队列
    public  function getTimeIsPraise(){

        $queue = Db::name("queue")->where('status', 0)->where('send_type','praise')->order('create_time ASC')->select();
        try {
            if(!empty($queue)){
                foreach ($queue as $key => $value) {
                    //站内信
                    // 1.当前任务将由哪个类来负责处理。
                    //   当轮到该任务时，系统将生成一个该类的实例，并调用其 fire 方法
                    $jobHandlerClassName = 'app\common\queue\SendMessageQueueClient@instationMsg';
                    // 2.当前任务归属的队列名称，如果为新队列，会自动创建
                    $jobQueueName = "sd_order_paise";
                    // 3.当前任务所需的业务数据 . 不能为 resource 类型，其他类型最终将转化为json形式的字符串
                    // (msgData 为对象时，需要在先在此处手动序列化，否则只存储其public属性的键值对)
                    $msgData = [
                        'id'              => $value['id'],
                        'title'           => $value['title'],
                        'uid'             => $value['user_id'],
                        'message_type'    => $value["send_type"],
                        'url'             =>  '',
                        'message_send_id' => $value['message_send_id'],
                    ];
                    // echo '开始推送消息:'.'</br>';
                    \think\Queue::push($jobHandlerClassName, $msgData, $jobQueueName);
                }
            }
        } catch (Exception $e) {
            echo $e->getMessage();
        }

    }










    /********************************************************************月定时***************************************************************/


    //自然月的月初变成15月/单
    public function monthPaike(){
        $value = Db::name("system")->where("key","in",["paike_register_month_task_count","paike_register_task_count","paike_register_task_day_count"])->select();
        Db::name("user_attribute")->where("uid","not null")->update(["month_task_count"=>$value[0]["value"],"task_count"=>$value[1]["value"],"task_day_count"=>$value[2]["value"]]);
    }





}